package com.bdqn.sys.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.api.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bdqn.common.utitls.DateGindViewResult;
import com.bdqn.common.utitls.JSONResult;
import com.bdqn.common.utitls.SystemConstants;
import com.bdqn.common.utitls.TreeNode;
import com.bdqn.sys.entity.Permission;
import com.bdqn.sys.entity.Role;
import com.bdqn.sys.service.PermissionService;
import com.bdqn.sys.service.RoleService;
import com.bdqn.sys.vo.RoleVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.awt.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author KazuGin
 * @since 2020-05-04
 */
@RestController
@RequestMapping("/sys/role")
public class RoleController {

    @Resource
    private RoleService roleService;

    @Resource
    private PermissionService permissionService;
    
    @RequestMapping("/list")
    public DateGindViewResult list(RoleVo roleVo){
        //创建分页对象
        IPage<Role> page=new  Page<Role>(roleVo.getPage(),roleVo.getLimit());
        //创建条件构造器
        QueryWrapper<Role> queryWrapper=new QueryWrapper<Role>();
        //角色编码
        queryWrapper.like(StringUtils.isNotBlank(roleVo.getRolecode()),"rolecode",roleVo.getRolecode());
        //角色姓名名称
        queryWrapper.like(StringUtils.isNotBlank(roleVo.getRolename()),"rolename",roleVo.getRolename());
        roleService.page(page,queryWrapper);
        //返回数据
        return new DateGindViewResult(page.getTotal(),page.getRecords());

    }



    /**
     * 角色添加
     */
    @RequestMapping("/addRole")
    public JSONResult addPermission(Role role){
        role.setCreatetime(new Date());
        if(roleService.save(role)){
            return SystemConstants.Add_SUCCESS;
        }
        return SystemConstants.Add_ERROR;
    }


    /**
     * 角色修改
     */
    @RequestMapping("/updateRole")
    public JSONResult updatePermission(Role role){
        if(roleService.updateById(role)){
            return SystemConstants.UPDATE_SUCCESS;
        }
        return SystemConstants.UPDATE_ERROR;
    }



    /**
     * 删除角色
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public JSONResult deleteById(int id){
        if (roleService.removeById(id)){
            return SystemConstants.DELETE_SUCCESS;
        }
        return SystemConstants.DELETE_ERROR;
    }

    /**
     * 权限分配
     * @param roleId
     * @return
     */
    @RequestMapping("/initPermissionByRoleId")
    public  DateGindViewResult initPermissionByRoleId(Integer roleId){

        try {
            //创建条件构造器
            QueryWrapper<Permission> queryWrapper=new QueryWrapper<Permission>();
            //第一步首先要查询所有权限
            List<Permission> permissionList = permissionService.list(queryWrapper);
            //根据角色ID查询当前角色下拥有的权限菜单
            //该集合保存的是当前角色的权限ID
            List<Integer>  currentRolePermissionIds=permissionService.findPermissionByRoleId(roleId);
            //创建集合保存当前角色拥有的权限ID
            List<Permission> currentPermissions=new ArrayList<Permission>();
            //判断该集合中是否存在数据
            if (currentRolePermissionIds!=null&&currentRolePermissionIds.size()>0){
                //如果拥有某些权限菜单，则根据查询出来的权限菜单编号再去查询菜单权限数据
                queryWrapper.in("id",currentRolePermissionIds);
                //查询权限菜单
                currentPermissions=permissionService.list(queryWrapper);
            }
            //构建树节点
            List<TreeNode>  treeNodes=new ArrayList<TreeNode>();
            //循环遍历所有权限菜单
            for (Permission p1 : permissionList) {
                //定义变量,保存菜单是否被选中
                String checkArr="0";//不选中
                //内层循环遍历当前角色拥有的权限菜单
                //内循环比较的原因：比较两个集合中的数据是否有相同的，有相同的表示d当前角色拥有这个权限
                for (Permission p2 : currentPermissions) {
                    //比较两个集合中是否有权限菜单ID是相等的，有相等相同的表示当前角色拥有这个权限，同时将复选框选中
                    if (p1.getId()==p2.getId()){
                        checkArr="1";//选中 1是表示选中
                        break;
                    }
                }
                //判断状态是否展开
                Boolean spread=(p1.getOpen()==null||p1.getOpen()==SystemConstants.STATE_OPENT)?true:false;
                //将选中的节点添加到节点集合中
                treeNodes.add(new TreeNode(p1.getId(),p1.getPid(),p1.getTitle(),spread,checkArr));

            }
            //返回数据
            return  new DateGindViewResult(treeNodes);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return  null;
    }

    /**
     *
     * @param rid 角色ID
     * @param ids   权限ID
     * @return
     */
    @PostMapping("/saveRolePermission")
    public JSONResult saveRolePermission(Integer rid,String ids){
        //调用保存角色权限关系的方法
        if(roleService.saveRolePermission(rid,ids)){
            return SystemConstants.DISTRIBUTE_SUCCESS;
        }
        return SystemConstants.DISTRIBUTE_ERROR;
    }
}

